"use strict";
// import { Deriction as x } from "./练习/Deriction"
//6. tuple
// 元组 (Tuple) 是⼀种特殊的数组类型，可以存储固定数量的元素，并且每个元素的类型是已
// 知的且可以不同。元组⽤于精确描述⼀组值的类型， ? 表示可选元素。
// 第⼀个元素必须是 string 类型，第⼆个元素必须是 number 类型。
var tuple_arr1;
// 第⼀个元素必须是 number 类型，第⼆个元素是可选的，如果存在，必须是 boolean 类型。
var tuple_arr2;
// 第⼀个元素必须是 number 类型，后⾯的元素可以是任意数量的 string 类型
var tuple_arr3;
// 可以赋值
tuple_arr1 = ['hello', 123];
tuple_arr2 = [100, false];
tuple_arr2 = [200];
tuple_arr3 = [100, 'hello', 'world'];
// console.log(...tuple_arr3)
tuple_arr3 = [100];
//7. enum
//枚举（ enum ）可以定义⼀组命名常量，它能增强代码的可读性，也让代码更好维护。
// 如下代码的功能是：根据调⽤ walk 时传⼊的不同参数，执⾏不同的逻辑，存在的问题是调⽤ 
// walk 时传参时没有任何提示，编码者很容易写错字符串内容；并且⽤于判断逻辑的 up 、 
// down 、 left 、 right 是连续且相关的⼀组值，那此时就特别适合使⽤ 枚举（ enum ）。
//1. 数字枚举
//数字枚举⼀种最常⻅的枚举类型，其成员的值会⾃动递增，且数字枚举还具备反向映射的
// 特点，在下⾯代码的打印中，不难发现：可以通过值来获取对应的枚举成员名称 。
var Deriction;
(function (Deriction) {
    //也可以指定枚举成员的初始值，其后的成员值会⾃动递增。
    Deriction[Deriction["Up"] = 6] = "Up";
    Deriction[Deriction["Down"] = 7] = "Down";
    Deriction[Deriction["Left"] = 8] = "Left";
    Deriction[Deriction["Right"] = 9] = "Right";
})(Deriction || (Deriction = {}));
//使⽤数字枚举完成刚才 walk 函数中的逻辑，此时我们发现： 代码更加直观易读，⽽且类型安全，同时也更易于维护
function walk(data) {
    if (data === Deriction.Up) {
        console.log("向【上】⾛");
    }
    else if (data === Deriction.Down) {
        console.log("向【下】⾛");
    }
    else if (data === Deriction.Left) {
        console.log("向【左】⾛");
    }
    else if (data === Deriction.Right) {
        console.log("向【右】⾛");
    }
    else {
        console.log("未知⽅向");
    }
}
walk(Deriction.Down);
walk(Deriction.Left);
walk(Deriction.Right);
walk(Deriction.Up);
// 反向映射
console.log(Deriction.Up);
console.log(Deriction[6]);
console.log(Deriction.Up); // 输出: 6
console.log(Deriction.Down); // 输出: 7
console.log(Deriction);
//2. 字符串枚举
//枚举成员的值是字符串
var Deriction2;
(function (Deriction2) {
    Deriction2["Up"] = "up";
    Deriction2["Down"] = "down";
    Deriction2["Left"] = "left";
    Deriction2["Right"] = "right";
})(Deriction2 || (Deriction2 = {}));
console.log(Deriction2.Down);
//3. 常量枚举
// 官⽅描述：常量枚举是⼀种特殊枚举类型，它使⽤ const 关键字定义，在编译时会被内联，避免⽣成⼀些额外的代码。
// 何为编译时内联？
// 所谓“内联”其实就是 TypeScript 在编译时，会将枚举成员引⽤替换为它们的实际值，
// ⽽不是⽣成额外的枚举对象。这可以减少⽣成的 JavaScript 代码量，并提⾼运⾏时性
// 能。
//使⽤普通枚举的 TypeScript 代码如下：
var Directions;
(function (Directions) {
    Directions[Directions["Up"] = 0] = "Up";
    Directions[Directions["Down"] = 1] = "Down";
    Directions[Directions["Left"] = 2] = "Left";
    Directions[Directions["Right"] = 3] = "Right";
})(Directions || (Directions = {}));
var dir_x = Directions.Up;
console.log(Directions.Up);
var Directions2_x = 0 /* Directions2.Up */;
// 编译后⽣成的 JavaScript 代码量较⼩：
// let Directions2_x = 0 /* Directions.Up */;
